unit Bot;

interface
Uses SysUtils, Dialogs;

Type Tablo = Array OF String;

Function RechercherMotsEssai(Lettres : string) : Tablo;

Function RechercherMots(Lettres : String) : Tablo;

Procedure OuvrirWords;

Function ToutVerifier(DebutX, DebutY : Byte; Str, Lettres : String; Hor : boolean) : boolean;

Var MotBot, WordsListe : Tablo;

implementation
Uses Verifier;

Function RechercherMots(Lettres : string) : Tablo;
var
    PMot : ^String;
    Str, StrEntre: String;
    I, Z, AB : Integer;
    Mot : string;
    Cpt, ValeurCur: Byte;
Begin
  Pmot := Addr(Mot);
  StrEntre := LowerCase(lettres);
  z := 0;
  For AB := 0 To High(WordsListe) DO
    Begin
      Str := StrEntre;
      Cpt := 0;                                  //initialise le compteur cpt
      ValeurCur := 0;                            //initialise le compteur ValeurCur
      PMot^ := WordsListe[AB];                       //Lit une ligne du PFichier^ (qui contient la liste de mots) et le stocke dans la variable mot.
      For I := 1 To Length(PMot^) Do               //effectue de 1 a la longueur du mot a tester
        Begin
          If Pos(PMot^[I], Str) <> 0 Then          //si il y a la lettre I du mot ds la Str(lettre ke l'on a)
            Begin
              Inc(Cpt);                          //incrémente le compteur cpt
              Delete(Str,Pos(PMot^[I],Str),1);     //suprime la lettre utilisé
            End
          Else
            Break;                             //sinon : on quitte la boucle : donc on saute le mot
        End;
      If (Cpt = Length(PMot^)) AND (Cpt > 1)  Then                  //si cpt et de la meme longueur ke : Mot : donc on peux faire ce mot avec les lettres a disposition
        Begin
            Begin
              SetLength(Result,z + 1);
              result[Z] := PMot^;
              inc(Z);
            End;
        End;
    End;

{------------------------------------------------------------------------------------------------------------------------------------}
End;


Procedure OuvrirWords;
Var I, J : Integer;
    Str : String;
    Fichier : TextFile;

Begin
  J := 0;
  AssignFile(Fichier,'words.in');
  Reset(Fichier);
  Repeat
    ReadLn(Fichier);
    Inc(j);
  Until Eof(Fichier);
  CloseFile(Fichier);

  SetLength(WordsListe,J);
  AssignFile(Fichier,'words.in');
  Reset(Fichier);
  For I := 0 To j - 1  Do
    Begin
      ReadLn(Fichier,Str);
      WordsListe[I] := Str;
    End;
  CloseFile(Fichier);
End;



Function ToutVerifier(DebutX, DebutY : Byte; Str, Lettres : String; Hor : boolean) : boolean;
Begin
Result := True;
IF Hor Then
  IF DebutX + Length(Str) <= 16 Then

  Begin
  IF Not VerifierNouveauMot(Length(Str),DebutX,DebutY,Hor) Then
    Begin
      Result := False;
      Exit;
    End;
                                                 
  If Not VerifierLettresF(UpperCase(Str), UpperCase(Lettres), Hor, DebutX,DebutY) Then
    Begin
      Result := False;
      Exit;
    End;
  IF (Not VerifierPos(Length(Str),DebutX,DebutY,Hor)) Then
    Begin
      Result := False;
      Exit;
    End;

  IF Not VerifierEntrerSimule(Str,Hor, DebutX, DebutY) Then
    Begin
      Result := False;
      Exit;
    End;
End
  Else
    Begin
      Result := false;
      Exit;
    End;


IF Not Hor Then
  IF DebutY + Length(Str) <= 16 Then

  Begin
  IF Not VerifierNouveauMot(Length(Str),DebutX,DebutY,False) Then
    Begin
      Result := False;
      Exit;
    End;

  If Not VerifierLettresF(UpperCase(Str), UpperCase(Lettres), False, DebutX,DebutY) Then
    Begin
      Result := False;
      Exit;
    End;
  IF Not VerifierPos(Length(Str),DebutX,DebutY,False) Then
    Begin
      Result := False;
      Exit;
    End;

  IF Not VerifierEntrerSimule(Str,False, DebutX, DebutY) Then
    Begin
      Result := False;
      Exit;
    End;
End
  Else
    Begin
      Result := false;
      Exit;
    End;

End;


Function RechercherMotsEssai(Lettres : string) : Tablo;
var
    PMot : ^String;
    Str, StrEntre: String;
    I, Z, k, AB : Integer;
    Mot : string;
    Cpt, ValeurCur: Byte;
    TabloLettre : Array[0..26] Of String;
Begin
  Pmot := Addr(Mot);
  z := 0;
  TabloLettre[0] := LowerCase(Lettres);
  For I := 1 To 26 Do
    Begin
      TabloLettre[I] := LowerCase(Lettres + Chr(I + 96));
    End;

  For AB := 0 To High(WordsListe) DO
    Begin
      PMot^ := WordsListe[AB];
      For K := 0 To 26 Do
        Begin
          Str := TabloLettre[K];
          Cpt := 0;                                  //initialise le compteur cpt
          For I := 1 To Length(PMot^) Do               //effectue de 1 a la longueur du mot a tester
            Begin
              If Pos(PMot^[I], Str) <> 0 Then          //si il y a la lettre I du mot ds la Str(lettre ke l'on a)
                Begin
                  Inc(Cpt);                          //incrémente le compteur cpt
                  Delete(Str,Pos(PMot^[I],Str),1);     //suprime la lettre utilisé
                End
              Else
                Break;                             //sinon : on quitte la boucle : donc on saute le mot
            End;
          If (Cpt = Length(PMot^)) AND (Cpt > 1)  Then                  //si cpt et de la meme longueur ke : Mot : donc on peux faire ce mot avec les lettres a disposition
            Begin
              Begin
                SetLength(Result,z + 1);
                result[Z] := PMot^;
                inc(Z);
                Break;
              End;
            End;
        End;
    End;


{------------------------------------------------------------------------------------------------------------------------------------}
End;



end.
